// import { createConnection } from 'net';

// import "reflect-metadata";
// import {createConnection} from "typeorm";
// import {User} from "./entity/User";

// createConnection().then(async connection => {

//     console.log("Inserting a new user into the database...");
//     const user = new User();
//     user.firstName = "Timber";
//     // user.lastName = "Saw";
//     user.age = 25;
//     await connection.manager.save(user);
//     console.log("Saved a new user with id: " + user.id);

//     console.log("Loading users from the database...");
//     const users = await connection.manager.find(User);
//     console.log("Loaded users: ", users);

//     console.log("Here you can setup and run express/koa/any other framework.");

// }).catch(error => console.log(error));

// 操作数据 插入数据
// import 'reflect-metadata';
// import { createConnection } from 'typeorm';
// import { User } from './entity/User';
// createConnection()
//   .then(async connection => {
//     // const selectUser=await connection.manager.find(User)
//     // console.log(selectUser,667788);

//     const user = new User();
//     user.username = '赵六1';
//     user.password = '123456';
//     user.age = 20;
//     const result = await connection.manager.save(user);
//     console.log('插入结果', result);
//   })
//   .catch(err => {
//     console.log(err);
//   });
// 查询数据 使用原生的select * from user即可  查询并统计 然后返回结果
// createConnection().then(async connection => {
//   //   //   const savedUser = await connection.manager.find(User);
//   //   let userRepository = connection.getRepository(User);
//   //   let result = await userRepository.findAndCount();
//   //   console.log(result);
//   let res = await connection.manager.query(`SELECT * FROM USER`);
//   console.log(res);
// });

// 删除数据
// createConnection().then(async connection=>{
//     // 创建句柄
//     let userRepository=await connection.manager.getRepository(User)
//     let singleUser=await userRepository.findOne(2)
//     // console.log(singleUser);
//     let flag=await userRepository.remove(singleUser)
//     console.log(flag);
// })

// 修改数据
// createConnection().then(async connection=>{
//     const userRepository=connection.getRepository(User)
//     const user=await userRepository.findOne(10)
//     user.password='123456789'
//     await userRepository.save(user)
// }).catch(err=>{
//     console.log(err);

// })

// 第四天 连表插入数据
import 'reflect-metadata';
import {
  createConnection,
  Not,
  LessThan,
  LessThanOrEqual,
  MoreThan,
  MoreThanOrEqual,
  Equal,
  Like,
  Between,
  In,
  getConnection,
  getRepository,
} from 'typeorm';
import { User } from './entity/User';
import { UserExtend } from './entity/UserExtend';
import { Posts } from './entity/Posts';
import { Tags } from './entity/Tags';
// import { UV_UDP_REUSEADDR } from 'constants';
import { equal } from 'assert';
// createConnection().then(async connection => {
//   const user = new User();
//   user.username = 'zhaoliu1';
//   user.password = '12345678';
//   user.age = 20;
//   const userExtend = new UserExtend();
//   userExtend.mobile = '13412312312';
//   userExtend.address = 'china';
//   //   关联2个数据模型
//   userExtend.user = user;
//   // 必须先保存用户表 因为他需要提供主键出来
//   const userRepository = connection.getRepository(User);
//   await userRepository.save(user);
//   // 保存扩展表
//   const userExtendRepository = connection.getRepository(UserExtend);
//   await userExtendRepository.save(userExtend);
//   console.log('插入数据成功');
// });

// 连表 查询数据
// createConnection().then(async connection => {
//   const userRepository = connection.getRepository(User);
//   //   1、使用relations关联正向查询数据(正向查询是指从主表查询到从表)
//   const result = await userRepository.find({ relations: ['userDetail'] });
//   console.log(result);
// });

// 反向查找 (一般一对一的关系中很少使用)
// createConnection().then(async connection => {
//   const userExtendRepositiory = connection.getRepository(UserExtend);
//   const result = await userExtendRepositiory.find({ relations: ['user'] });
//   console.log(result);
// });

// 一对多和多对1的查询

// createConnection().then(async connection => {
//   const posts1 = new Posts();
//   posts1.title = '文章5';
//   posts1.content = '文章5内容';
//   const posts2 = new Posts();
//   posts2.title = '文章6';
//   posts2.content = '文章6内容';
//   // 创建一个用户
//   const user = new User();
//   user.username = '田七';
//   user.password = '123456';
//   user.age = 30;
//   // const userExtend = new UserExtend();
//   // userExtend.mobile = '13412312312';
//   // userExtend.address = 'china';
//   // 将多个数据传递过去
//   user.posts = [posts1, posts2];
//   const userRepository = connection.getRepository(User);
//   const postsRepository = connection.getRepository(Posts);
//   // 创建用户属性数据 将数据进行保存
//   // const userExtendRepositiory = connection.getRepository(UserExtend);

//   await postsRepository.save(posts1);
//   await postsRepository.save(posts2);
//   // await userExtendRepositiory.save(userExtend);
//   await userRepository.save(user);
//   console.log('添加数据成功');
// });

// 查询数据 正向查询
// createConnection().then(async connection => {
//   const userRepository = connection.getRepository(User);
//   const result = await userRepository.find({ relations: ['posts'] });
//   console.log(JSON.stringify(result));
// });
// 反向查数据

// createConnection().then(async connection => {
//   const postsRepository = connection.getRepository(Posts);
//   const result = await postsRepository.find({ relations: ['user'] });
//   console.log(JSON.stringify(result));
// });

// 多对多 数据查询

// createConnection()
//   .then(async connection => {
//     const tag1 = new Tags();
//     tag1.name = 'mysql3';
//     const tag2 = new Tags();
//     tag2.name = 'node3';
//     const posts1 = new Posts();
//     posts1.title = '文章5';
//     posts1.content = '文章5内容';
//     posts1.tags = [tag1, tag2];
//     const posts2 = new Posts();
//     posts2.title = '文章6';
//     posts2.content = '文章6内容';
//     posts2.tags = [tag1];
//     const user = new User();
//     user.username = '田七1';
//     user.password = '1237890';
//     user.age = 40;
//     user.posts = [posts1, posts2];
//     // 对数据进行保存
//     const userRepository = connection.getRepository(User);
//     const postsRepository = connection.getRepository(Posts);
//     const tagRepository = connection.getRepository(Tags);
//     await tagRepository.save(tag1);
//     await tagRepository.save(tag2);
//     await postsRepository.save(posts1);
//     await postsRepository.save(posts2);
//     await userRepository.save(user);

//     console.log('添加数据成功');
//   })
//   .catch(e => {
//     console.log(e);
//   });

// createConnection().then(async connection => {
//   const postsRepository = connection.getRepository(Posts);
//   const result = await postsRepository.findOne({
//     where: { id: 1 },
//     relations: ['tags', 'user'],
//   });
//   console.log(result);
// });

// 第五天  数据库的查询
// 1.查询全量数据
// createConnection().then(async connection=>{
//   // 查询的第一种方式
//   // const userRepository=connection.getRepository(User)
//   // const result=await userRepository.find()
//   // console.log(result);
//   // 查询的第二种方式
//   let result=await connection.manager.query(`SELECT * FROM USER`)
//   console.log(result);
// })
// 2.查询部分数据
// createConnection().then(async connection=>{
// const userRepository=connection.getRepository(User)
// const result =await userRepository.find({select:['id','username']})
// console.log(result);
// 使用原生mysql查询
// let result=await connection.manager.query(`SELECT id,username FROM USER`)
// console.log(result);

// })
// 3.使用where查询条件语句
// createConnection().then(async connection=>{
// const userRepository=connection.getRepository(User)
// let result=await userRepository.find({where:{id:14}})
// console.log(result);
// 使用原生查询 或者是使用 select * from user where user.id = 1 and user.age=30
// let result=await connection.manager.query(`SELECT * FROM USER WHERE id=14 and age=30`)
// console.log(result);
// })

// 4.使用where 多条件查询 用and
// createConnection().then(async connection=>{
//   // const userRepository=connection.getRepository(User)
//   // const result=await userRepository.find({where:{id:14,username:'田七'}})
//   // console.log(result);
//   let result=await connection.manager.query(`SELECT * FROM USER WHERE user.id=14 and user.username='田七'`)
//   console.log(result);
// })

// 5.使用where 多条件or的关系查询数据
// createConnection().then(async connection=>{
//   // const userRepository=connection.getRepository(User)
//   // let result=await userRepository.find({where:[{id:14},{username:'zhangsan'}]})
//   // console.log(result);
//   // 使用原生mysql查询
//   let result=await connection.manager.query(`SELECT * FROM USER WHERE id=14 or username='zhangsan'`)
//   console.log(result);
// })

// 6.relations关系查询(提前是要现有外键关联关系)
// createConnection().then(async connection=>{
//   // const userRepository=connection.getRepository(User)
//   // const result=await userRepository.find({relations:['userDetail']})
//   // console.log(result);
//   // 类似使用原生mysql查询 查询全部
//   // const result =await connection.manager.query(`SELECT * from USER as a left join user_extend as b on a.id=b.userId`)
//   const result =await connection.manager.query(`SELECT a.username, a.age, b.address,b.mobile FROM USER as a left join user_extend as b on a.id=b.userId`)
//   console.log(result);
// })

// 7.使用relations 的扩展
// createConnection().then(async connection=>{
//   const userRepository=connection.getRepository(User)
//   let result=await userRepository.find({join:{
//     alias:'user',
//     leftJoinAndSelect:{
//       detail:'user.userDetail',
//       posts:'user.posts'
//     }
//   }})
//   console.log(JSON.stringify(result));
// })

// 8使用order 进行排序
// createConnection().then(async connection=>{
// const userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   order:{
//     id:'DESC',
//     username:'ASC'
//   }
// })
// console.log(result);
// 使用原生mysql 查询
// const result =await connection.manager.query(`SELECT * FROM USER order by username asc,id desc`)
// console.log(result);
// })

//  9. 分页查询数据 skip 偏移  take 查询多少条数据
// createConnection().then(async connection=>{
//   // let userRepository=connection.getRepository(User)
//   // let result=await userRepository.find({
//   //   skip:0,
//   //   take:3
//   // })
//   // console.log(result);
//   // 使用原生mysql 第一个数是需要省略的数组 第二个是查询的条数
//   let result=await connection.manager.query(`SELECT * FROM USER limit 3,3`)
//   console.log(result);
// })

// 9.find 进阶的选项

//  1. Not
// createConnection().then(async connection=>{
// let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   username:Not('王五')
// })
// console.log(result);
// 使用sql查询
// let result=await connection.manager.query(`SELECT * FROM USER where username!='王五'`)
// console.log(result);

// LessThan 小于 一般用于数字
// let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:LessThan(10)
// })
// console.log(result);
// 使用原生sql
// let result=await connection.manager.query(`SELECT * FROM USER where id<10`)
// console.log(result);

// 小于等于
//   let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:LessThanOrEqual(10)
// })
// console.log(result);

// 大于
// let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:MoreThan(10)
// })
// console.log(result);

// 大于等于

//  let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:MoreThanOrEqual(10)
// })
// console.log(result);

// 等于
//  let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:Equal(14)
// })
// console.log(result);

// 模糊匹配查询 like
//  let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   username:Like('%wang%')
// })
// console.log(result);
// let result=await connection.manager.query(`SELECT * FROM USER where username LIKE '%wang%'`)
// console.log(result);

// between
//    let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:Between(1,15)
// })
// console.log(result);
// In

//      let userRepository=connection.getRepository(User)
// let result=await userRepository.find({
//   id:In([1,15,16])
// })
// console.log(result);

// })

// 第五天 高级查询QueryBuilder的使用   它允许你使用优雅便捷的语法构建SQL查询

// createConnection().then(async connection=>{
//   const user=await getConnection().createQueryBuilder()
//   .select(['user.id','user.username']) // 需要查询的字段 如果想全部查询可以不添加select
//   .from(User,'user') // 从那长表开始查询 并定义别名为user
//   .where('(user.id=:id)',{id:11}) // 过滤条件id=11
//   .getOne()
//   console.log(user);

// })

// 使用connection创建的方式2
// createConnection().then(async connection=>{
//   const user=await getConnection()
//   .createQueryBuilder(User,'user')
//   .select(['user.id','user.username'])
//   .where('(user.id=:id)',{id:15})
//   .getOne()
//   console.log(user);

// })
// 使用entity Manage方法查询
// createConnection().then(async connection=>{
//   const user=await getRepository(User)
//   .createQueryBuilder('user')
//   .getMany();
//   console.log(user);

// })

// QueryBuilder五种类型
// 查询数据
// createConnection().then(async connection=>{
//   const user=await getConnection()
//   .createQueryBuilder(User,'user')
//   .select(['user.id','user.username'])
//   .where('(user.id=:id)',{id:11})
//   .getOne()
//   console.log(user);

// })
// 插入数据
// createConnection().then(async connection=>{
//   const result=await getConnection()
//   .createQueryBuilder()
//   .insert()
//   .into(User)
//   .values([{username:'zhaoliu',password:'12345678',age:20},{username:'lisi',password:'123456',age:35}])
//   .execute()
//   console.log(result);

// })
// 更新数据
// createConnection().then(async connection=>{
//   const result=await getConnection()
//   .createQueryBuilder()
//   .update(User)
//   .set({username:'hahhaha'})
//   .where('(id=:id)',{id:14})
//   .execute()
//   console.log(result);

// })
// 删除数据
// createConnection().then(async connection=>{
//   const result =await getConnection()
//   .createQueryBuilder()
//   .delete()
//   .from(User)
//   .where('(id=:id)',{id:18})
//   .execute()
//   console.log(result);
// })

// 创建关系查询
// createConnection().then(async connection=>{
//   const result=await getConnection()
//   .createQueryBuilder(User,'user')
//   .leftJoinAndMapMany('user.posts',Posts,'posts','user.id=posts.userId')
//   .getMany()
//   console.log(JSON.stringify(result));
// })

// 查询数据的方法
// getOne 查询一条数据
// getMany 查询多条树
// getRawOne 使用聚合函数的时候下查询一条数据
// getRawMany 使用聚合函数的情况下查询多条数据
//  createConnection().then(async connection=>{
//    let result=await getConnection()
//    .createQueryBuilder(User,'user')
//    .select('SUM(user.id)','sum')
//    .getRawOne()
//    console.log(result); // 计算所有user.id的和

//  })
// 五、传递参数
// 1、直接使用

// .where("user.username = :username", { username: "哈哈" })
// 2、使用setParameter填充值

// .where("user.username = :username")
// .setParameter("username", "哈哈")
// 3、LINK模糊查询

// .where("user.username like :username", {username: `% %{username} %`})
// 4、IN查询

// .where("user.username IN (:...username)", { username: [ "Timber", "Cristal", "Lina" ] })
